package com.lxu;

/**
 * happens-before规则的应用
 * 以下程序会出现四种情况：
 * 1、a=1,b=2;
 * 2、a=3,b=3;
 * 3、a=3,b=2;
 * 4、a=1,b=3;
 * 第4种情况发生的原因：a被修改了，但是其它线程不可见，然后b被修改了，其它线程可见；是有问题的
 * 第4种情况预防的措施：对变量b加上volatile修饰，保证a=3; happens-before b=a;也就是说b之前的写入操作
 * 在各个线程中都是可见的
 */
public class VolatileDemo7 {
    public static void main(String[] args) {
        while (true) {
            HappensBefore happensBefore = new HappensBefore();
            new Thread(() -> {
                happensBefore.reader();
            }).start();
            new Thread(() -> {
                happensBefore.writer();
            }).start();
        }
    }
}

class HappensBefore {
    private int a = 1, b =2;

    public void reader() {
        System.out.println("a=" + a + ";b=" + b);
    }

    public void writer() {
        a = 3;
        b = a;
    }
}